import pandas as pd
from datetime import datetime, timedelta

# 读取Excel文件
file_path = 'D:\\xlzx\\票\\2025\\jfdbOutOfRange.xlsx'
df = pd.read_excel(file_path)

# 打印列名以检查
print("列名:", df.columns.tolist())

# 确保开始时间和结束时间列是datetime类型
df['开始时间'] = pd.to_datetime(df['开始时间'])
df['结束时间'] = pd.to_datetime(df['结束时间'])

# 计算天数并包含起始和结束时间
df['天数'] = (df['结束时间'] - df['开始时间']).dt.days + 1

# 计算每天的平均电量
df['平均电量'] = df['总电量'] / df['天数']

# 读取报账电表文件
reimbursement_file_path = 'D:\\xlzx\\票\\2025\\报账电表.xls'
reimbursement_df = pd.read_excel(reimbursement_file_path)

# 确保缴费电表列是字符串类型
df['缴费电表'] = df['缴费电表'].astype(str)
reimbursement_df['缴费电表编码'] = reimbursement_df['缴费电表编码'].astype(str)

# 根据缴费电表列关联报账电表编码
df = pd.merge(df, reimbursement_df[['缴费电表编码', '报账电表编码']], left_on='缴费电表', right_on='缴费电表编码', how='left')

# 重新排列列的顺序，将报账电表编码放在第一列
df = df[['缴费电表', '报账电表编码', '开始时间', '结束时间', '总电量', '天数', '平均电量']]

# 创建一个新的数据框来存储每天的电量
daily_data = []

for index, row in df.iterrows():
    start_date = row['开始时间']
    end_date = row['结束时间']
    total_days = row['天数']
    daily_power = row['平均电量']
    
    for day in range(total_days):
        date = start_date + timedelta(days=day)
        daily_data.append({
            '缴费电表': row['缴费电表'],
            '报账电表编码': row['报账电表编码'],
            '日期': date,
            '电量': daily_power
        })

# 将列表转换为数据框
daily_df = pd.DataFrame(daily_data)

# 生成固定31天的日期范围
all_dates = pd.date_range(start=df['开始时间'].min(), periods=31)

# 创建一个包含所有日期的完整数据框
complete_df = pd.DataFrame([(date,) for date in all_dates], columns=['日期'])

# 将daily_df与complete_df合并，确保所有日期都在
daily_df = pd.merge(complete_df, daily_df, on='日期', how='left')

# 填充缺失的缴费电表和报账电表编码
daily_df['缴费电表'] = daily_df.groupby((daily_df['缴费电表'] != daily_df['缴费电表'].shift()).cumsum())['缴费电表'].ffill()
daily_df['报账电表编码'] = daily_df.groupby((daily_df['报账电表编码'] != daily_df['报账电表编码'].shift()).cumsum())['报账电表编码'].ffill()

# 填充缺失的电量为0
daily_df['电量'] = daily_df['电量'].fillna(0)

# 将日期转换为列名
daily_df = daily_df.pivot(index=['缴费电表', '报账电表编码'], columns='日期', values='电量').reset_index()

# 重新命名列名
daily_df.columns = ['缴费电表', '报账电表编码'] + [f'电量{date.day}' for date in all_dates]

# 确保 '缴费电表' 列是字符串类型，以避免合并时出现类型不匹配的问题
daily_df['缴费电表'] = daily_df['缴费电表'].astype(str)
df['缴费电表'] = df['缴费电表'].astype(str)

# 将 daily_df 中的电量1到电量31按缴费电表关联到 df 中
for i in range(1, 32):
    column_name = f'电量{i}'
    df = pd.merge(df, daily_df[['缴费电表', column_name]], on='缴费电表', how='left', suffixes=('', f'_{i}'))

# 重命名列名以避免冲突
for i in range(1, 32):
    df.rename(columns={f'电量{i}': f'电量{i}_daily'}, inplace=True)

# 填充缺失的电量列为0
for i in range(1, 32):
    df[f'电量{i}_daily'] = df[f'电量{i}_daily'].fillna(0)
# 保存结果到新的 Excel 文件
output_file_path = 'D:\\xlzx\\票\\2025\\日标杆结果.xlsx'
df.to_excel(output_file_path, index=False)